package dao

import (
	"go-admin1/admin/system/model"
	"go-admin1/internal/infrastructure/database"
	"go-admin1/internal/infrastructure/logger"

	"go.uber.org/zap"
	"gorm.io/gorm"
)

// SysRoleDeptDao 角色部门关联数据访问接口
type SysRoleDeptDao interface {
	Create(roleDept *model.SysRoleDept) error
	GetByRoleID(roleID int64) ([]*model.SysRoleDept, error)
	GetByDeptID(deptID int64) ([]*model.SysRoleDept, error)
	DeleteByRoleID(roleID int64) error
	DeleteByDeptID(deptID int64) error
	DeleteByRoleIDAndDeptID(roleID, deptID int64) error
	ListDeptIDsByRoleID(roleID int64) ([]int64, error)
	ListRoleIDsByDeptID(deptID int64) ([]int64, error)
}

type sysRoleDeptDao struct {
	db *gorm.DB
}

// NewSysRoleDeptDao 创建角色部门关联数据访问实例
func NewSysRoleDeptDao() SysRoleDeptDao {
	return &sysRoleDeptDao{
		db: database.GetDB(),
	}
}

func (rd *sysRoleDeptDao) Create(roleDept *model.SysRoleDept) error {
	logger.Info("创建角色部门关联",
		zap.Int64("role_id", roleDept.RoleID),
		zap.Int64("dept_id", roleDept.DeptID))
	return rd.db.Create(roleDept).Error
}

func (rd *sysRoleDeptDao) GetByRoleID(roleID int64) ([]*model.SysRoleDept, error) {
	logger.Debug("根据角色ID获取角色部门关联", zap.Int64("role_id", roleID))
	var roleDepts []*model.SysRoleDept
	err := rd.db.Where("role_id = ?", roleID).Find(&roleDepts).Error
	return roleDepts, err
}

func (rd *sysRoleDeptDao) GetByDeptID(deptID int64) ([]*model.SysRoleDept, error) {
	logger.Debug("根据部门ID获取角色部门关联", zap.Int64("dept_id", deptID))
	var roleDepts []*model.SysRoleDept
	err := rd.db.Where("dept_id = ?", deptID).Find(&roleDepts).Error
	return roleDepts, err
}

func (rd *sysRoleDeptDao) DeleteByRoleID(roleID int64) error {
	logger.Info("根据角色ID删除角色部门关联", zap.Int64("role_id", roleID))
	return rd.db.Where("role_id = ?", roleID).Delete(&model.SysRoleDept{}).Error
}

func (rd *sysRoleDeptDao) DeleteByDeptID(deptID int64) error {
	logger.Info("根据部门ID删除角色部门关联", zap.Int64("dept_id", deptID))
	return rd.db.Where("dept_id = ?", deptID).Delete(&model.SysRoleDept{}).Error
}

func (rd *sysRoleDeptDao) DeleteByRoleIDAndDeptID(roleID, deptID int64) error {
	logger.Info("根据角色ID和部门ID删除角色部门关联",
		zap.Int64("role_id", roleID),
		zap.Int64("dept_id", deptID))
	return rd.db.Where("role_id = ? AND dept_id = ?", roleID, deptID).Delete(&model.SysRoleDept{}).Error
}

func (rd *sysRoleDeptDao) ListDeptIDsByRoleID(roleID int64) ([]int64, error) {
	logger.Debug("根据角色ID获取部门ID列表", zap.Int64("role_id", roleID))
	var deptIDs []int64
	err := rd.db.Model(&model.SysRoleDept{}).Where("role_id = ?", roleID).Pluck("dept_id", &deptIDs).Error
	return deptIDs, err
}

func (rd *sysRoleDeptDao) ListRoleIDsByDeptID(deptID int64) ([]int64, error) {
	logger.Debug("根据部门ID获取角色ID列表", zap.Int64("dept_id", deptID))
	var roleIDs []int64
	err := rd.db.Model(&model.SysRoleDept{}).Where("dept_id = ?", deptID).Pluck("role_id", &roleIDs).Error
	return roleIDs, err
}
